package zhentao;



import com.google.gson.Gson;
import zhentao.util.TypewriterEffect;

import java.io.InputStream;
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;
import java.util.Scanner;

public class DeepSeekClient {
    // 定义API密钥和URL，使用static修饰以便类加载时初始化
    private static String API_KEY;
    private static String API_URL;

    // 静态初始化块，在类加载时执行
    static {
        Properties properties = new Properties();  // 创建Properties对象读取配置文件
        try {
            // 获取配置文件的输入流
            InputStream is = DeepSeekClient.class.getResourceAsStream("/config.properties");
            properties.load(is);  // 加载配置文件
            API_KEY = properties.getProperty("key");  // 读取API密钥
            API_URL = properties.getProperty("url");  // 读取API URL
        } catch (Exception e) {
            throw new RuntimeException(e);  // 如果出错抛出运行时异常
        }
    }

    // 主程序入口
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);  // 创建Scanner对象读取用户输入
        String input = "";
        System.out.println("*** 我是 DeepSeek ，很高兴见到您 ****");  // 欢迎语

        // 主循环，持续接收用户输入
        while(true){
            System.out.println("---请说您问题：---");
            String question = scanner.next();  // 读取用户输入
            if("bye".equals(question)){  // 如果用户输入"bye"则退出
                break;
            }
            ask(question);  // 调用ask方法处理用户问题
            System.out.println();
        }
        System.out.println("拜拜，欢迎下次使用！");  // 退出时的告别语
    }

    // 向DeepSeek API提问的方法
    public static void ask(String content){
        // 创建消息列表，用于构建API请求
        List<Message> messages = new ArrayList<>();
        messages.add(new Message("user", content));  // 添加用户消息

        // 构建请求体对象
        ChatRequest requestBody = new ChatRequest(
                "deepseek-chat",  // 模型名称
                messages,  // 消息列表
                0.7,  // temperature参数，控制生成文本的随机性
                1000  // max_tokens参数，限制生成的最大token数
        );

        System.out.println(">>>正在提交问题...");
        long startTime = System.currentTimeMillis();  // 记录开始时间

        // 发送请求并获取响应
        String response = sendRequest(requestBody);

        long endTime = System.currentTimeMillis();  // 记录结束时间
        System.out.println("思考用时："+(endTime-startTime)/1000+"秒");  // 计算并打印响应时间

        // 使用打字机效果打印响应内容，每20毫秒打印一个字符
        TypewriterEffect.printWord(response,20);
    }

    // 发送HTTP请求到DeepSeek API的方法
    private static String sendRequest(ChatRequest requestBody) {
        HttpClient client = HttpClient.newHttpClient();  // 创建HTTP客户端
        Gson gson = new Gson();  // 创建Gson对象用于JSON处理

        // 将请求体对象转换为JSON字符串
        String requestBodyJson = gson.toJson(requestBody);

        try {
            // 构建HTTP请求
            HttpRequest request = HttpRequest.newBuilder()
                    .uri(URI.create(API_URL))  // 设置API端点
                    .header("Content-Type", "application/json")  // 设置内容类型
                    .header("Authorization", "Bearer " + API_KEY)  // 设置认证头
                    .POST(HttpRequest.BodyPublishers.ofString(requestBodyJson))  // 设置POST方法和请求体
                    .build();  // 构建请求对象

            System.out.println(">>>已提交问题，正在思考中....");

            // 发送请求并获取响应
            HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());

            // 检查响应状态码
            if (response.statusCode() == 200) {
                // 解析响应JSON为ChatResponse对象
                ChatResponse chatResponse = gson.fromJson(response.body(), ChatResponse.class);
                // 返回AI生成的内容
                return chatResponse.getChoices().get(0).getMessage().getContent();
            } else {
                // 如果请求失败，返回错误信息
                return "请求失败，状态码: " + response.statusCode() + ", 响应: " + response.body();
            }
        } catch (Exception e) {
            e.printStackTrace();  // 打印异常堆栈
            return "请求异常: " + e.getMessage();  // 返回异常信息
        }
    }

    // 消息类，表示对话中的一条消息
    static class Message {
        private String role;  // 角色，如"user"或"assistant"
        private String content;  // 消息内容

        public Message(String role, String content) {
            this.role = role;
            this.content = content;
        }

        public String getContent() {
            return content;
        }
    }

    /**
     * 请求体的数据内部结构，用于构建请求 JSON
     */
    static class ChatRequest {
        private String model;  // 使用的模型名称
        private List<Message> messages;  // 消息列表
        private double temperature;  // 温度参数，控制生成随机性
        private int max_tokens;  // 最大token数限制

        public ChatRequest(String model, List<Message> messages, double temperature, int max_tokens) {
            this.model = model;
            this.messages = messages;
            this.temperature = temperature;
            this.max_tokens = max_tokens;
        }
    }

    /**
     * 响应体的数据结构，用于解析API返回的JSON
     */
    static class ChatResponse {
        private List<Choice> choices;  // 选择列表，包含AI生成的结果

        public List<Choice> getChoices() {
            return choices;
        }

        // 内部Choice类，表示一个生成选项
        static class Choice {
            private Message message;  // 生成的消息

            public Message getMessage() {
                return message;
            }
        }
    }
}